// Вычисление статистических зарактеристик
// генеретора псевдослучайных чисел
// из стандартной библиотеки

#include <stdio.h>	// printf
#include <stdlib.h> // rand, srand
#include <time.h>	// time
#include <math.h>	// sqrt

#include "array.hpp"

// Заполнить массив X случайными равномерно распределёнными
// целыми числами из интервала [a,b]
void generate_uniform(ArrayInt &X, int a, int b){
	srand(time(NULL)); // Инициализация генератора СЧ
	for(size_t i = 0; i < X.length(); ++i){
		X[i] = a + rand()%(b - a);
	}
}

// Мат. ожидание
double median(const ArrayInt &X){
	double M = 0.0;
	for(size_t i = 0; i < X.length(); ++i){
		M += X[i];
	}
	return M/X.length();
}

// Дисперсия
double dispersion(const ArrayInt &X){
	double D = 0.0;
	double M = 0.0;
	for(size_t i = 0; i < X.length(); ++i){
		M += X[i];
		D += X[i]*X[i];
	}

	D /= X.length() + 1;
	M /= X.length();
	D -= M*M;

	return D;
}

int main(){
	const int n = 999;
	const int a = 0;
	const int b = 100;

	ArrayInt X(n);
	generate_uniform(X, a, b);
	// Расчётные значения
	double Mstar = median(X);
	double sigmastar = sqrt(dispersion(X));
	// Теоретические значения для равномерного распределения
	double M = (a + b)/2.0;
	double sigma = (b - a)/sqrt(12.0);

	// Сравнение расчётных и теоретических значений
	printf("M[X] = %g,\t\t M*[X] = %g,\t err = %.2g%%\n", \
							M, Mstar, fabs((M - Mstar)/M)*100);
	printf("sigma[X] = %g,\t sigma*[X] = %g,\t err = %.2g%%\n", \
							sigma, sigmastar, fabs((sigma - sigmastar)/sigma)*100);
	return 0;
}

